<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <h2>一、前言</h2>
  <div>作为页面渲染和内容展现的重要环节，css影响着用户对整个网站的第一体验。因此，在整个产品研发过程中，css性能优化同样需要贯穿全程</div>
  <h2>二、实现方式</h2>
  <div>实现方式有很多种，主要有如下：</div>
  <br>
  <ul>
    <li>内联首屏关键CSS</li>
    <li>异步加载CSS</li>
    <li>资源压缩</li>
    <li>合理使用选择器</li>
    <li>减少使用昂贵的属性</li>
    <li>不要使用@import</li>
  </ul>
  <h4>内联首屏关键CSS</h4>
  <div>在打开一个页面，页面首要内容出现在屏幕的时间影响着用户的体验，而通过内联css关键代码能够使浏览器在下载完html后就能立刻渲染。但是较大的css代码并不合适内联（初始拥塞窗口、没有缓存），而其余代码则采取外部引用方式</div>
  <h4>异步加载CSS</h4>
  <h4>资源压缩</h4>
  <div>利用webpack、gulp/grunt、rollup等模块化工具，将css代码进行压缩，使文件变小，大大降低了浏览器的加载时间</div>
  <h4>合理使用选择器</h4>
  <div>css匹配的规则是从右往左开始匹配，例如#markdown .content h3匹配规则如下：</div>
  <ul>
    <li>先找到h3标签元素</li>
    <li>然后去除祖先不是.content的元素</li>
    <li>最后去除祖先不是#markdown的元素</li>
  </ul>
  <br>
  <div>如果嵌套的层级更多，页面中的元素更多，那么匹配所要花费的时间代价自然更高</div>
  <br>
  <div>所以我们在编写选择器的时候，可以遵循以下规则：</div>
  <ul>
    <li>不要嵌套使用过多复杂选择器，最好不要三层以上</li>
    <li>使用id选择器就没必要再进行嵌套</li>
    <li>通配符和属性选择器效率最低，避免使用</li>
  </ul>
  <h4>减少使用昂贵的属性</h4>
  <div>在页面发生重绘的时候，昂贵属性如box-shadow/border-radius/filter/透明度/:nth-child等，会降低浏览器的渲染性能</div>
  <h4>不要使用@import</h4>
  <div>css样式文件有两种引入方式，一种是link元素，另一种是@import</div>
  <br>
  <div>@import会影响浏览器的并行下载，使得页面在加载时增加额外的延迟，增添了额外的往返耗时</div>
  <br>
  <div>而且多个@import可能会导致下载顺序紊乱。比如一个css文件index.css包含了以下内容：@import url("reset.css")。那么浏览器就必须先把index.css下载、解析和执行后，才下载、解析和执行第二个文件reset.css</div>
  <h4>其他</h4>
  <ul>
    <li>减少重排操作，以及减少不必要的重绘</li>
    <li>了解哪些属性可以继承而来，避免对这些属性重复编写</li>
    <li>cssSprite，合成所有icon图片，用宽高加上backgroud-position的背景图方式</li>
    <li>显现出我们要的icon图，减少了http请求</li>
    <li>把小的icon图片转成base64编码</li>
    <li>CSS3动画或者过渡尽量使用transform和opacity来实现动画，不要使用left和top属性</li>
  </ul>
  <h4>三、总结</h4>
  <div>css实现性能的方式可以从选择器嵌套、属性特性、减少http这三面考虑，同时还要注意css代码的加载顺序</div>
  <h4>link和@import引入样式文件的区别：</h4>
  <div>link和@import都是外部引用css的方式，推荐使用link标签，这样可以避免考虑@import的语法规则和注意事项，避免昌盛资源文件下载顺序混乱和http请求过多的烦恼</div>
  <br>
  <div>区别:</div>
  <ul>
    <li>从属关系：@import是css提供的语法规则，只有导入样式表的作用；link是html提供的标签，不仅可以加载css文件，还可以定义rss、rel连接属性等</li>
    <li>加载顺序：加载页面时，link标签引入的css被同时加载；@import引入的css将在页面加载完毕后被加载</li>
    <li>兼容性：@import是css2.1才有的语法，故只可在ie5+才能识别；link标签作为html元素，不存在兼容性问题</li>
    <li>DOM可控性：可以通过js操作DOM，插入link标签来改变样式；由于DOM方法是基于文档的，无法使用@import的方式插入样式。</li>
    <li>link引入的样式权重大于@import引入的样式（在link标签引入的css文件中使用@import时，相同样式将被该css文件本身的样式(link中的生效)层叠）</li>
  </ul>
</body>
</html>